package pack0702.com;
//演示常用类

import java.util.Objects;

/**
 * 演示object类的clone方法
 * clone方法用来将对象复制一份,类似生活中的克隆羊
 * 没有任何代码的接口是声明式接口
 */
public class Person implements Cloneable{  //Cloneable是一个接口,克隆必须实现这个接口

    public String name ="张无忌";
    public int age =20;

    //演示toString

    @Override
    public String toString() {
//        return "Person{" +
//                "name='" + name + '\'' +
//                ", age=" + age +
//                '}';
        return name+","+ age;   //return中的变现形式可以修改
    }
//重写了toString方法

    //演示equals

    @Override
    public boolean equals(Object o) {
//        if (this == o) return true;
//        if (o == null || getClass() != o.getClass()) return false;   //getClass()是提取字节码
//        Person person = (Person) o;
//        return age == person.age && Objects.equals(name, person.name);

        Person pe=(Person) o;
 //       return pe.name.equals(this.name);    //只比较名字

        return pe.age==this.age;  //比较的是年龄;基本类型全部用"=="来比较,对象用equals来比较,==来比较地址
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
    //重写了equals方法

    public static void main(String[] args) /*throws CloneNotSupportedException*/  //克隆不支持异常
    {
        Person p=new Person();
        System.out.println(p.name+","+p.age);
        try{
            Person p1= (Person) p.clone(); //java中,克隆需要征得接口的同意;p.clone强转成p1
            System.out.println(p1.name+","+p1.age);
            System.out.println(p==p1);   //p和p1是查找内存中的地址
        }catch(Exception e){
            e.printStackTrace();//打印堆栈的详细信息

        }
   //步骤分析:首先,创建一个对象p,再克隆一个对象p1,因为clone有异常,为克隆不支持异常,必须征得接口Cloneable的同意,所以要去实现Cloneable,
        //然后获取异常的堆栈信息,最后将p.clone强制转换为Person中的p1.


    }

}
